package com.zk.mybatisplus.common.utils;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.Enumeration;

/**
 * 用于获取用户的ip
 * ip==InetAddress.getHostAddress
 */
public class HttpContextUtil {
    public static HttpServletRequest getRequest() {
        return  ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();
    }

    /**
     * 获取IP地址的方法
     */
    public static InetAddress getLocalHostLANAddress() throws UnknownHostException {
                try {
                        InetAddress candidateAddress = null;
                         // 遍历所有的网络接口
                         for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements();) {
                               NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
                                 // 在所有的接口下再遍历IP
                                 for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements();) {
                                         InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
                                         if (!inetAddr.isLoopbackAddress()) {// 排除loopback类型地址
                                                 if (inetAddr.isSiteLocalAddress()) {
                                                         // 如果是site-local地址，就是它了
                                                         return inetAddr;
                                                     } else if (candidateAddress == null) {
                                                         // site-local类型的地址未被发现，先记录候选地址
                                                         candidateAddress = inetAddr;
                                                     }
                                             }
                                     }
                             }
                         if (candidateAddress != null) {
                                 return candidateAddress;
                             }
                         // 如果没有发现 non-loopback地址.只能用最次选的方案
                         InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
                         if (jdkSuppliedAddress == null) {
                                 throw new UnknownHostException("The JDK InetAddress.getLocalHost() method unexpectedly returned null.");
                             }
                         return jdkSuppliedAddress;
                     } catch (Exception e) {
                         UnknownHostException unknownHostException = new UnknownHostException(
                                         "Failed to determine LAN address: " + e);
                         unknownHostException.initCause(e);
                         throw unknownHostException;
                     }
             }

}